package br.com.equus.bean;

import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.model.SelectItem;

import br.com.arquitetura.bean.PaginableBean;
import br.com.arquitetura.excecao.ExcecaoUtil;
import br.com.arquitetura.util.ComboUtil;
import br.com.arquitetura.util.FacesMessagesUtil;
import br.com.arquitetura.util.Mascara;
import br.com.equus.entidade.Categoria;
import br.com.equus.entidade.Produto;
import br.com.equus.entidade.UnidadeMedida;
import br.com.equus.util.ValidacaoUtil;

@ManagedBean(name = "produtoBean")
@ViewScoped
public class ProdutoBean extends PaginableBean<Produto> {

	private static final long serialVersionUID = 1L;

	private List<SelectItem> listaCategoria;
	private List<SelectItem> listaUnidade;

	private Integer idCategoria;
	private Integer idUnidade;
	private String controlado;

	public ProdutoBean() {
	}

	@SuppressWarnings("unchecked")
	@PostConstruct
	public void carregarListas() {
		try {
			listaCategoria = ComboUtil.getItens(universalManager.listBy(new Categoria(true)));
			Collections.sort(listaCategoria, new Comparator<SelectItem>() {
				@Override
				public int compare(SelectItem o1, SelectItem o2) {
					return o1.getLabel().compareTo(o2.getLabel());
				}
			});
			listaUnidade = ComboUtil.getItens(universalManager.listBy(new UnidadeMedida(true)));
			Collections.sort(listaUnidade, new Comparator<SelectItem>() {
				@Override
				public int compare(SelectItem o1, SelectItem o2) {
					return o1.getLabel().compareTo(o2.getLabel());
				}
			});

		} catch (Exception e) {
			ExcecaoUtil.tratarExcecao(e);
		}

	}

	@Override
	public String load() {
		try {
			super.load();
			getModel().setPesoToString(getModel().getPeso().toString());
			getModel().setQtdMinimaToString(getModel().getQtdMinima().toString());
			idCategoria = getModel().getCategoria().getId();
			idUnidade = getModel().getUnidadeMedida().getId();
			if (getModel().getControlado()) {
				controlado = "1";
			} else {
				controlado = "2";
			}

		} catch (Exception e) {
			ExcecaoUtil.tratarExcecao(e);
		}

		return SUCCESS;

	}

	@Override
	public String save() {
		try {

			if (ValidacaoUtil.doubleValido(getModel().getPesoToString())) {
				getModel().setPeso(Mascara.marcarDouble(getModel().getPesoToString()));
			} else {
				FacesMessagesUtil.addErrorMessage("Peso ", " Está em um formato incorreto");
				return ERROR;
			}

			if (ValidacaoUtil.doubleValido(getModel().getQtdMinimaToString())) {
				getModel().setQtdMinima(Mascara.marcarDouble(getModel().getQtdMinimaToString()));
			} else {
				FacesMessagesUtil.addErrorMessage("Qtd Minima ", " Está em um formato incorreto");
				return ERROR;
			}

			getModel().setCategoria(new Categoria(idCategoria));
			getModel().setUnidadeMedida(new UnidadeMedida(idUnidade));
			if (controlado.equals("1")) {
				getModel().setControlado(true);
			} else if (controlado.equals("2")) {
				getModel().setControlado(false);
			}

			super.save();
			idCategoria = null;
			idUnidade = null;
			controlado = null;
		} catch (Exception e) {
			ExcecaoUtil.tratarExcecao(e);
		}

		return SUCCESS;
	}

	@Override
	public void verificarAcesso() {
		acessoBean.bloquearTela("ROLE_PRODUTO");

	}

	@Override
	public Produto createModel() {
		return new Produto();
	}

	@Override
	public String getQualifiedName() {
		return "Produto";
	}

	@Override
	public boolean isFeminino() {
		return false;
	}

	@Override
	public Map<String, String> getFilters() {
		return null;
	}

	public List<SelectItem> getListaCategoria() {
		return listaCategoria;
	}

	public void setListaCategoria(List<SelectItem> listaCategoria) {
		this.listaCategoria = listaCategoria;
	}

	public Integer getIdCategoria() {
		return idCategoria;
	}

	public void setIdCategoria(Integer idCategoria) {
		this.idCategoria = idCategoria;
	}

	public static long getSerialversionuid() {
		return serialVersionUID;
	}

	public List<SelectItem> getListaUnidade() {
		return listaUnidade;
	}

	public void setListaUnidade(List<SelectItem> listaUnidade) {
		this.listaUnidade = listaUnidade;
	}

	public Integer getIdUnidade() {
		return idUnidade;
	}

	public void setIdUnidade(Integer idUnidade) {
		this.idUnidade = idUnidade;
	}

	public String getControlado() {
		return controlado;
	}

	public void setControlado(String controlado) {
		this.controlado = controlado;
	}

}
